package com.dosen.api.third.party.cmp.client;


import com.dosen.api.third.party.cmp.model.CloudPlatform;
import com.dosen.api.third.party.cmp.model.CmpInfo;
import com.dosen.api.third.party.cmp.model.V1VendorsParams;
import com.dosen.api.third.party.cmp.model.hostinfo.CmpHost;
import com.dosen.api.third.party.cmp.model.hostinfo.CmpHostParam;
import com.dosen.api.third.party.cmp.model.login.LoginData;
import com.dosen.api.third.party.cmp.model.overview.AllocationRate;
import com.dosen.api.third.party.cmp.model.overview.ReportsParam;
import com.dosen.api.third.party.cmp.model.overview.StatsParam;
import com.dosen.api.third.party.cmp.model.overview.UtilizationRate;
import com.dosen.api.third.party.cmp.model.vdc.CmpVDataCenter;
import com.dosen.api.third.party.cmp.model.vdc.VDataCenterParam;
import com.dosen.api.third.party.cmp.model.vhostinfo.CmpVHost;
import com.dosen.api.third.party.cmp.model.vhostinfo.CmpVHostParam;
import com.dosen.api.third.party.cmp.model.vhostinfo.CmpVmCountParam;
import com.dosen.api.third.party.cmp.model.vhostinfo.QueryVmInfoByNameParam;

import java.util.List;
import java.util.Map;

/**
 * @version V1.0
 * @author: guangcheng
 * @date: 2023/1/12 12:16
 * @description: 综合云管平台纳管各种云平台；综合云管平台是第一级资源，云平台是第二级资源，虚拟机是第三级资源
 * 从简处理，可将云平台作为第一级资源，综合云管平台就不出现在eaas中？哪一种方式比较好？
 */
public interface CmpClient {

    /**
     * 获取综合云管平台用户登陆时数据
     * 此为登陆接口，调用成功后会返回token，并将token存储在本地jvm进程中
     *
     * @return
     */
    LoginData getLoginData();

    /**
     * 获取token: 直到获取有效token为止
     *
     * @return
     */
    String token();

    /**
     * 校验token
     *
     * @param token
     * @return
     */
    boolean tokenCheck(String token);

    /**
     * 综合云管平台信息返回
     *
     * @return
     */
    CmpInfo cmpInfo();

    /**
     * 云平台列表
     *
     * @param page   1
     * @param rows   10
     * @param params [{"param":{"vendorCategory":"COMPUTE"},"sign":"EQ"}]
     * @return
     */
    List<CloudPlatform> cloudPlatformList(String page, String rows, List<V1VendorsParams> params);

    /**
     * 云平台列表简化接口
     *
     * @param page           1
     * @param rows           10
     * @param vendorCategory COMPUTE
     * @return
     */
    List<CloudPlatform> cloudPlatformList0(String page, String rows, String vendorCategory);

    /**
     * 云平台下宿主机列表
     *
     * @param page   1
     * @param rows   10
     * @param type   Vmware
     * @param params [{"param":{"vendorId":143},"sign":"EQ"}]
     * @return
     */
    List<CmpHost> cmpHostList(String page, String rows, String type, List<CmpHostParam> params);

    /**
     * 云平台宿主机列表简化接口
     *
     * @param vendorId 100 云平台id
     * @param type     Vmware
     * @param page     1
     * @param rows     10
     * @return
     */
    List<CmpHost> cmpHostList0(Integer vendorId, String type, String page, String rows);

    /**
     * 指定云平台下的虚拟机 返回Map
     *
     * @param page   1
     * @param rows   10
     * @param params [{"param":{"vendorId":143,"isTemplate":false},"sign":"EQ"}]
     * @return
     */
    Map<String, Object> cmpVHostDataMap(String page, String rows, List<CmpVHostParam> params);

    /**
     * 指定云平台下的虚拟机列表 简化接口
     *
     * @param vendorId 100 云平台id
     * @param page     1
     * @param rows     10
     * @return
     */
    List<CmpVHost> cmpVHostList(Integer vendorId, String page, String rows);

    /**
     * 通过虚拟机名称查询虚拟机信息
     *
     * @param page   1
     * @param rows   2
     * @param params [{"param":{"name":"nfs"},"sign":"LK"},{"param":{"vendorId":143,"isTemplate":false},"sign":"EQ"}]
     * @return
     */
    List<CmpVHost> queryCmpVHostsByNameLike(String page, String rows, List<QueryVmInfoByNameParam> params);

    /**
     * @param vmName   myvm01
     * @param vendorId 100
     * @param page     1
     * @param rows     10
     * @return
     */
    List<CmpVHost> queryCmpVHostsByNameLike0(String vmName, Integer vendorId, String page, String rows);

    /**
     * 指定云平台下的全部虚拟机
     *
     * @param vendorId 100
     * @return
     */
    List<CmpVHost> allVHost(Integer vendorId);

    /**
     * 综合云管平台虚拟机 返回Map
     *
     * @param page   1
     * @param rows   10
     * @param params [{"param":{"isTemplate":false},"sign":"EQ"}]
     * @return
     */
    Map<String, Object> vmsDataMap(String page, String rows, List<CmpVmCountParam> params);

    /**
     * 通过虚拟机名称从综合云管平台级别直接查询虚拟机
     *
     * @param name
     * @param page
     * @param rows
     * @return
     */
    List<CmpVHost> queryCmpVmsByName(String name, String page, String rows);

    /**
     * 综合云管平台下虚拟机列表
     *
     * @param page 1
     * @param rows 10
     * @return
     */
    List<CmpVHost> cmpVms(String page, String rows);

    /**
     * 综合云管平台下的虚拟机数量
     *
     * @return
     */
    Integer vmsCount();

    /**
     * 综合云管平台下的所有虚拟机
     *
     * @return
     */
    List<CmpVHost> cmpAllVm();

    /**
     * 指定云平台下的数据中心 返回Map
     *
     * @param page   1
     * @param rows   10
     * @param params [{"param":{"vendorId":143},"sign":"EQ"}]
     * @return
     */
    Map<String, Object> cmpVDataCenterMap(String page, String rows, List<VDataCenterParam> params);

    /**
     * 指定云平台下的数据中心数量
     *
     * @param vendorId 100
     * @return
     */
    Integer vdcNum(Integer vendorId);

    /**
     * 指定云平台下的数据中心列表 简化接口
     *
     * @param page     1
     * @param rows     10
     * @param vendorId 100
     * @return
     */
    List<CmpVDataCenter> cmpVDataCenterList0(String page, String rows, Integer vendorId);

    /**
     * 指定云平台下所有的数据中心列表 简化接口
     *
     * @param vendorId 100
     * @return
     */
    List<CmpVDataCenter> allCmpVDataCenterList(Integer vendorId);

    /**
     * 指定云平台下的各种类型资源使用率：CPU 内存 磁盘
     *
     * @param param {"code":"resUsed","vendorId":143,"vendor":"VMWARE"}
     * @return
     */
    List<UtilizationRate> utilizationRateList(StatsParam param);

    /**
     * 指定云平台下的各类资源使用率 简化接口
     *
     * @param vendorId 100
     * @return
     */
    List<UtilizationRate> utilizationRateList0(Integer vendorId);

    /**
     * 指定云平台下的资源分配情况，可以看到是否出现超分配情形，当未使用出现负数时就是超分配
     *
     * @param param {"vendorId":143,"category":"vendor"}
     * @return
     */
    AllocationRate allocationRate(ReportsParam param);

    /**
     * 指定云平台下的资源分配情况 简化接口
     *
     * @param vendorId 100
     * @return
     */
    AllocationRate allocationRate0(Integer vendorId);
}
